package cn.lijiguo.concurrency.threadpool;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * <pre>
 *     有界线程池 newFixedThreadPool
 * </pre>
 * <p>
 *     Java Executor 框架提供了一个用于创建固定大小线程池的方法 Executors.newFixedThreadPool(nThreads)
 *     这种线程池在应用程序的整个生命周期内都保持相同数量的线程
 *     当有新任务提交时，如果线程池中的最大数未达到最大值，将会创建新的线程来处理任务
 *     否则任务将会被放在队列等到执行
 * </p>
 * <p>
 *     优缺点：
 * </p>
 * <p>优点</p>
 * <li>1、控制资源使用，有界线程池限制了线程的数量，防止线程数量无限增长，从而有效的控制了资源的使用</li>
 * <li>2、避免资源耗尽</li>
 * <li>3、稳定性</li>
 * <p>缺点</p>
 * <li>1、灵活性差</li>
 * <li>2、不适用于瞬时高并发</li>
 * <li>3、可能导致线程饥饿</li>
 * <p>
 *     <b>有界线程池适用于相对稳定的工作负载，能够限制线程数量，防止资源耗尽</b>
 *     在选择线程池类型时，需要根据应用场景和性能需求来进行权衡。
 * </p>
 * @author lijiguo
 */
@Slf4j
public class FixedThreadPoolDemo {

    public static void main(String[] args) {
        // 创建一个固定大小为3的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        // 提交任务
        for (int i = 0; i < 5; i++) {
            final int taskId = i;
            executorService.submit(() -> {
                log.info("Task " + taskId + " is executing by " + Thread.currentThread().getName());
                try {
                    // 模拟任务执行
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    log.error(e.getMessage(), e);
                    Thread.currentThread().interrupt();
                }
            });
        }

        // 关闭线程池
        executorService.shutdown();
    }
}
